/**
 * 游戏流程状态示例
 * 展示如何使用ProcessSystem管理游戏流程
 */

import { GameFramework } from "../../core/runtime/base/GameFramework";
import { ITransitionCondition } from "../../core/runtime/FSMSystem";
import { ProcessState } from "../../core/runtime/ProcessSystem";
import { GameState } from "../configs/GameState";



// 启动状态
export class LaunchState extends ProcessState {
    constructor() {
        super(GameState.Launch);
    }

    onProcessInit(): void {
        console.log("游戏启动中...");
        // 显示启动画面
        GameFramework.ui.openWindow("LoadingView").then(() => {
            if (window) {
                // 检查热更新
                GameFramework.hotUpdate.checkUpdate();
                
                // 监听热更新事件
                GameFramework.event.on("HOTUPDATE_UPTODATE", () => {
                    console.log("当前已是最新版本");
                    this.onLoadingViewLoaded(window);
                });
                
                GameFramework.event.on("HOTUPDATE_NEWVERSION", () => {
                    console.log("发现新版本，开始热更新");
                    GameFramework.hotUpdate.hotUpdate();
                });
                
                GameFramework.event.on("HOTUPDATE_FINISHED", () => {
                    console.log("热更新完成");
                    this.onLoadingViewLoaded(window);
                });
                
                GameFramework.event.on("HOTUPDATE_ERROR", (error: string) => {
                    console.error("热更新错误:", error);
                    // 即使热更新失败也继续游戏
                    this.onLoadingViewLoaded(window);
                });
            }
        });
        // 可以加载必要的资源
        // GameFramework.ui.openWindow("LoadingView").then(() => {
        //     // 加载完成，切换到启动状态
        //     GameFramework.process.changeState(GameState.MainMenu);
        // });
    }
    
    private onLoadingViewLoaded(window: any): void {
        // LoadingView加载完成后的回调处理
        console.log("LoadingView加载完成");
        
        GameFramework.process.changeState(GameState.MainMenu);
        // 可以在这里执行其他初始化操作
        // 例如加载必要资源
        // GameFramework.resource.load("config/gameConfig").then(() => {
        //     console.log("资源配置加载完成");
        //     // 资源加载完成后切换到主菜单状态
        //     GameFramework.process.changeState("MainMenu");
        // }).catch((error) => {
        //     console.error("资源配置加载失败:", error);
        //     // 即使加载失败也切换到主菜单状态
        //     GameFramework.process.changeState("MainMenu");
        // });
    }
    // onUpdate(deltaTime: number): void {
    //     // 启动画面逻辑，例如显示进度条
        
    //     // 模拟启动过程
    //     setTimeout(() => {
    //         // 启动完成后切换到主菜单状态
    //         GameFramework.process.changeState("MainMenu");
    //     }, 2000);
    // }

    onProcessEnd(): void {
        console.log("启动完成");
    }
}

// 主菜单状态
export class MainMenuState extends ProcessState {
    private _isTransitionReady: boolean = false;

    constructor() {
        super(GameState.MainMenu);
    }

    onProcessInit(): void {
        console.log("进入主菜单");
        // 显示主菜单UI
        GameFramework.ui.openWindow("MainMenuView");
    }

    onUpdate(deltaTime: number): void {
        // 主菜单逻辑
        // 等待用户操作
        if (this._isTransitionReady) {
            GameFramework.process.changeState("GamePlay");
            this._isTransitionReady = false;
        }
    }

    onProcessEnd(): void {
        console.log("离开主菜单");
        // 关闭主菜单UI
        GameFramework.ui.closeWindow("MainMenuView");
    }

    // 由UI按钮调用
    startGame(): void {
        this._isTransitionReady = true;
    }
}

// 游戏进行状态
export class GamePlayState extends ProcessState {
    private _score: number = 0;
    private _isGameOver: boolean = false;

    constructor() {
        super(GameState.GamePlay);
    }

    onProcessInit(): void {
        console.log("开始游戏");
        this._score = 0;
        this._isGameOver = false;
        // 初始化游戏场景
        // GameFramework.ui.openWindow("GameUI");
    }

    onUpdate(deltaTime: number): void {
        // 游戏逻辑更新
        if (!this._isGameOver) {
            // 更新游戏逻辑
            // this._score += deltaTime;
        } else {
            // 游戏结束后切换到结算界面
            GameFramework.process.changeState("GameResult");
        }
    }

    onProcessEnd(): void {
        console.log("游戏结束");
        // 清理游戏场景
        // GameFramework.ui.closeWindow("GameUI");
    }

    // 触发游戏结束
    gameOver(): void {
        this._isGameOver = true;
    }

    // 获取当前分数
    getScore(): number {
        return this._score;
    }
}

// 游戏结果状态
export class GameResultState extends ProcessState {
    constructor() {
        super(GameState.GameResult);
    }

    onProcessInit(): void {
        console.log("显示游戏结果");
        // 显示结果UI
        // const score = (GameFramework.process.getPreviousState() as GamePlayState).getScore();
        // GameFramework.ui.openWindow("ResultUI", { score: score });
    }

    onUpdate(deltaTime: number): void {
        // 结果界面逻辑
    }

    onProcessEnd(): void {
        console.log("关闭结果界面");
        // GameFramework.ui.closeWindow("ResultUI");
    }

    // 返回主菜单
    backToMenu(): void {
        GameFramework.process.changeState("MainMenu");
    }
}

// 转换条件示例
export class TimeCondition implements ITransitionCondition {
    name: string = "TimeCondition";
    private _duration: number = 0;
    private _startTime: number = 0;

    constructor(duration: number) {
        this._duration = duration;
    }

    check(): boolean {
        return (Date.now() - this._startTime) >= this._duration;
    }

    reset(): void {
        this._startTime = Date.now();
    }
}

// 使用示例
// export class ProcessSystemExample {
//     static setupGameProcess(): void {
//         // 创建游戏流程状态
//         const launchState = new LaunchState();
//         const mainMenuState = new MainMenuState();
//         const gamePlayState = new GamePlayState();
//         const gameResultState = new GameResultState();

//         // 添加状态到流程系统
//         GameFramework.process.addProcessState(launchState);
//         GameFramework.process.addProcessState(mainMenuState);
//         GameFramework.process.addProcessState(gamePlayState);
//         GameFramework.process.addProcessState(gameResultState);

//         // 启动游戏流程
//         GameFramework.process.startProcess("Launch");
//     }
// }